package com.henrich.ccb.java8stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * <p>功能描述： 归集: toList/toSet/toMap </p>
 * <p>修订记录</p>
 * 流不存储数据，那么在流中的数据完成处理后，需要将流中的数据重新归集到新的集合里。
 * collect主要依赖java.util.stream.Collectors类内置的静态方法。
 * toList、toSet和toMap比较常用，另外还有toCollection、toConcurrentMap等复杂一些的用法。
 *
 * @Author xianghui.zh
 * @Version 1.0 2022/2/21
 **/
public class CollectDemo {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 6, 3, 4, 6, 7, 9, 6, 20);
        Set<Integer> collectSet = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toSet());
        List<Integer> collectList = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
        System.out.println("set: " + collectSet.toString());
        System.out.println("list: " + collectList.toString());

        // 统计
        /**
         * Collectors提供了一系列用于数据统计的静态方法：
         * 计数：count
         * 平均值：averagingInt、averagingLong、averagingDouble
         * 最值：maxBy、minBy
         * 求和：summingInt、summingLong、summingDouble
         * 统计以上所有：summarizingInt、summarizingLong、summarizingDouble
         */
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Tom", 8900, 23, "male", "New York"));
        personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
        personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
        Long count = personList.stream().collect(Collectors.counting());
        System.out.println(count);
        Double avgAge = personList.stream().collect(Collectors.averagingInt(Person::getAge));
        System.out.println(avgAge);
    }
}
